/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.senaclem.atus.vista;

import co.edu.senaclem.logica.AreaLogicaLocal;
import co.edu.senaclem.logica.ClienteExternoLogicaLocal;
import co.edu.senaclem.logica.DependenciaLogicaLocal;
import co.edu.senaclem.logica.PersonalLogicaLocal;
import co.edu.senaclem.logica.TurnoLogicaLocal;
import co.edu.senaclem.logica.UsuariosLogicaLocal;
import co.edu.senaclem.modelo.Area;
import co.edu.senaclem.modelo.ClienteExterno;
import co.edu.senaclem.modelo.Dependencia;
import co.edu.senaclem.modelo.Personal;
import co.edu.senaclem.modelo.Turno;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.inputtextarea.InputTextarea;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author anfeles
 */
@ManagedBean(name = "turnosVista")
@RequestScoped
public class TurnosVista {

    @EJB
    private DependenciaLogicaLocal dependenciaLogica;

    @EJB
    private AreaLogicaLocal areaLogica;

    @EJB
    private PersonalLogicaLocal personalLogica;

    @EJB
    private ClienteExternoLogicaLocal clienteExternoLogica;

    @EJB
    private TurnoLogicaLocal turnoLogica;

    @EJB
    private UsuariosLogicaLocal usuariosLogica;

    private InputText txtIdentificacion;
    private InputText txtNombre;
    private InputText txtApellido;
    private InputText txtCorreo;
    private InputText txtTelefono;
    private InputTextarea txtMotivo;
    private InputTextarea txtObservaciones;
    private InputText txtHoraIngreso;
    private InputText txtHoraSalida;
    private InputText txtEstado;
    private int txtNumTurno;
    private SelectOneMenu cmbArea;
    private SelectOneMenu cmbDependencia;
    private CommandButton btnRegistrar;
    private CommandButton btnLimpiar;
    private CommandButton btnRefrescar;
    private Date fechaSistema;
    private String horaSistema;
    private ArrayList<SelectItem> itemsDependencia = null;
    private ArrayList<SelectItem> itemsArea = null;
    private Turno selectedTurno;
    private List<Turno> listaTurnos = null;

    public InputText getTxtIdentificacion() {
        return txtIdentificacion;
    }

    public void setTxtIdentificacion(InputText txtIdentificacion) {
        this.txtIdentificacion = txtIdentificacion;
    }

    public InputText getTxtNombre() {
        return txtNombre;
    }

    public void setTxtNombre(InputText txtNombre) {
        this.txtNombre = txtNombre;
    }

    public InputText getTxtApellido() {
        return txtApellido;
    }

    public void setTxtApellido(InputText txtApellido) {
        this.txtApellido = txtApellido;
    }

    public InputText getTxtCorreo() {
        return txtCorreo;
    }

    public void setTxtCorreo(InputText txtCorreo) {
        this.txtCorreo = txtCorreo;
    }

    public InputText getTxtTelefono() {
        return txtTelefono;
    }

    public void setTxtTelefono(InputText txtTelefono) {
        this.txtTelefono = txtTelefono;
    }

    public SelectOneMenu getCmbArea() {
        return cmbArea;
    }

    public void setCmbArea(SelectOneMenu cmbArea) {
        this.cmbArea = cmbArea;
    }

    public SelectOneMenu getCmbDependencia() {
        return cmbDependencia;
    }

    public void setCmbDependencia(SelectOneMenu cmbDependencia) {
        this.cmbDependencia = cmbDependencia;
    }

    public CommandButton getBtnRegistrar() {
        return btnRegistrar;
    }

    public void setBtnRegistrar(CommandButton btnRegistrar) {
        this.btnRegistrar = btnRegistrar;
    }

    public CommandButton getBtnLimpiar() {
        return btnLimpiar;
    }

    public void setBtnLimpiar(CommandButton btnLimpiar) {
        this.btnLimpiar = btnLimpiar;
    }

    public InputTextarea getTxtMotivo() {
        return txtMotivo;
    }

    public void setTxtMotivo(InputTextarea txtMotivo) {
        this.txtMotivo = txtMotivo;
    }

    public InputTextarea getTxtObservaciones() {
        return txtObservaciones;
    }

    public void setTxtObservaciones(InputTextarea txtObservaciones) {
        this.txtObservaciones = txtObservaciones;
    }

    public InputText getTxtHoraIngreso() {
        return txtHoraIngreso;
    }

    public void setTxtHoraIngreso(InputText txtHoraIngreso) {
        this.txtHoraIngreso = txtHoraIngreso;
    }

    public InputText getTxtHoraSalida() {
        return txtHoraSalida;
    }

    public void setTxtHoraSalida(InputText txtHoraSalida) {
        this.txtHoraSalida = txtHoraSalida;
    }

    public InputText getTxtEstado() {
        return txtEstado;
    }

    public void setTxtEstado(InputText txtEstado) {
        this.txtEstado = txtEstado;
    }

    public int getTxtNumTurno() {
        return txtNumTurno;
    }

    public void setTxtNumTurno(int txtNumTurno) {
        this.txtNumTurno = txtNumTurno;
    }

    public ArrayList<SelectItem> getItemsDependencia() {
        if (itemsDependencia == null) {
            itemsDependencia = new ArrayList<SelectItem>();
            List<Dependencia> lista;
            try {
                lista = dependenciaLogica.consultar(); //llama al factory
                for (int i = 0; i < lista.size(); i++) {
                    itemsDependencia.add(new SelectItem(lista.get(i).getCodigo(), lista.get(i).getNombre()));
                }
            } catch (Exception ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return itemsDependencia;
    }

    public void setItemsDependencia(ArrayList<SelectItem> itemsDependencia) {
        this.itemsDependencia = itemsDependencia;
    }

    public ArrayList<SelectItem> getItemsArea() {
        //se debe llenar al inicio para que se pueda setear mas adelante
        if (itemsArea == null) {
            itemsArea = new ArrayList<SelectItem>();
            List<Area> lista;
            try {
                lista = areaLogica.consultar(); //llama al factory
                for (int i = 0; i < lista.size(); i++) {
                    itemsArea.add(new SelectItem(lista.get(i).getCodigo(), lista.get(i).getNombre()));
                }
            } catch (Exception ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return itemsArea;
    }

    public void setItemsArea(ArrayList<SelectItem> itemsArea) {
        this.itemsArea = itemsArea;
    }

    public String getFechaSistema() {
        fechaSistema = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //System.out.println("La fecha de hoy es:" + sdf.format(fechaSistema));         
        return sdf.format(fechaSistema);
    }

    public void setFechaSistema(Date fechaSistema) {
        this.fechaSistema = fechaSistema;
    }

    public String getHoraSistema() {
        Calendar calendario = new GregorianCalendar();
        int hora = calendario.get(Calendar.HOUR_OF_DAY);//hora formato 24 horas
        int minutos = calendario.get(Calendar.MINUTE);
        //int segundos=calendario.get(Calendar.SECOND);
        horaSistema = String.valueOf(hora) + ":" + String.valueOf(minutos);

        return horaSistema;
    }

    public void setHoraSistema(String horaSistema) {
        this.horaSistema = horaSistema;
    }

    public Turno getSelectedTurno() {
        return selectedTurno;
    }

    public void setSelectedTurno(Turno selectedTurno) {
        this.selectedTurno = selectedTurno;
    }

    public List<Turno> getListaTurnos() {
        if (listaTurnos == null) {
            try {
                //System.out.println("Va a consultar los turnos");
                setListaTurnos(turnoLogica.consultar());
            } catch (Exception ex) {
                Logger.getLogger(TurnosVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return listaTurnos;
    }

    public void setListaTurnos(List<Turno> listaTurnos) {
        this.listaTurnos = listaTurnos;
    }

    public CommandButton getBtnRefrescar() {
        return btnRefrescar;
    }

    public void setBtnRefrescar(CommandButton btnRefrescar) {
        this.btnRefrescar = btnRefrescar;
    }

    public void onRowSelect(SelectEvent event) {
        //ystem.out.println("Selecciono el Turno");
        if (usuariosLogica.validarSesion()) {
            Turno turno = (Turno) event.getObject();
            txtIdentificacion.setValue(turno.getDocumentoCliente().getDocumento().getDocumento());
            txtNombre.setValue(turno.getDocumentoCliente().getDocumento().getNombre());
            txtApellido.setValue(turno.getDocumentoCliente().getDocumento().getApellido());
            txtCorreo.setValue(turno.getDocumentoCliente().getDocumento().getCorreo());
            txtTelefono.setValue(turno.getDocumentoCliente().getDocumento().getTelefono());
            cmbDependencia.setValue(turno.getArea().getDependencia().getCodigo());
            cmbArea.setValue(turno.getArea().getCodigo());
            txtEstado.setValue(turno.getEstado());
            txtHoraIngreso.setValue(turno.getHoraIngreso());
            txtHoraSalida.setValue(turno.getHoraSalida());
            txtMotivo.setValue(turno.getMotivo());
            setTxtNumTurno(turno.getNumero());
            txtObservaciones.setValue(turno.getObservaciones());

            btnRegistrar.setDisabled(true);
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(TurnosVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void onDependenciaChange() {
        if (usuariosLogica.validarSesion()) {
            //System.out.println("onDependenciaChange");
            String dependencia = cmbDependencia.getValue().toString();
            //System.out.println("dependencia seleccionada: " + dependencia);

            try {
                itemsArea = new ArrayList<SelectItem>();
                List<Area> lista = areaLogica.consultar(Integer.parseInt(dependencia));
                for (int i = 0; i < lista.size(); i++) {
                    itemsArea.add(new SelectItem(lista.get(i).getCodigo(), lista.get(i).getNombre()));
                }
                setItemsArea(itemsArea);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(TurnosVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void limpiar_action() {
        //System.out.println("Limpiar turno");
        txtIdentificacion.setValue("");
        txtNombre.setValue("");
        txtApellido.setValue("");
        txtTelefono.setValue("");
        txtCorreo.setValue("");
        cmbArea.setValue("-1");
        cmbDependencia.setValue("-1");
        txtMotivo.setValue("");
        txtEstado.setValue("PENDIENTE");
        txtHoraIngreso.setValue(getHoraSistema());
        txtHoraSalida.setValue("");
        txtObservaciones.setValue("");
        btnRegistrar.setDisabled(false);
    }

    public void refrescar_action() {
        //System.out.println("Refrescar Turnos");
        setListaTurnos(null);
    }

    public void txtIdentificacion_listener() {
        //System.out.println("Entro al listener de documento");
        if (usuariosLogica.validarSesion()) {
            Personal entityPersonal = null;
            ClienteExterno entityCliente = null;
            try {
                Long documento = Long.parseLong(txtIdentificacion.getValue().toString());
                entityPersonal = personalLogica.consultarPorId(documento);
                entityCliente = clienteExternoLogica.consultarPorId(documento);
            } catch (Exception ex) {
                Logger.getLogger(FuncionarioVista.class.getName()).log(Level.SEVERE, null, ex);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "El Documento debe ser Númerico!"));
            }

            if (entityPersonal == null) //si la persona no existe
            {
                txtNombre.setValue("");
                txtApellido.setValue("");
                txtCorreo.setValue("");
                txtTelefono.setValue("");
                cmbArea.setValue("-1");
                cmbDependencia.setValue("-1");
                txtMotivo.setValue("");
                txtEstado.setValue("PENDIENTE");
                txtHoraIngreso.setValue(getHoraSistema());
                txtHoraSalida.setValue("");
                txtObservaciones.setValue("");

                btnRegistrar.setDisabled(false);

                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "no");
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existeCliente", "no");
            } else if (entityCliente == null) //si la persona existe pero no como clienteexterno
            {
                txtNombre.setValue(entityPersonal.getNombre());
                txtApellido.setValue(entityPersonal.getApellido());
                txtCorreo.setValue(entityPersonal.getCorreo());
                txtTelefono.setValue(entityPersonal.getTelefono());
                cmbArea.setValue("-1");
                cmbDependencia.setValue("-1");
                txtMotivo.setValue("");
                txtEstado.setValue("PENDIENTE");
                txtHoraIngreso.setValue(getHoraSistema());
                txtHoraSalida.setValue("");
                txtObservaciones.setValue("");
                btnRegistrar.setDisabled(false);
                //el personal ya existe por tanto guarda el estado en una variable de sesion
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "si");
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existeCliente", "no");
            } else //si ya existe como clienteexterno
            {
                txtNombre.setValue(entityCliente.getDocumento().getNombre());
                txtApellido.setValue(entityCliente.getDocumento().getApellido());
                txtCorreo.setValue(entityCliente.getDocumento().getCorreo());
                txtTelefono.setValue(entityCliente.getDocumento().getTelefono());
                cmbArea.setValue("-1");
                cmbDependencia.setValue("-1");
                txtMotivo.setValue("");
                txtEstado.setValue("PENDIENTE");
                txtHoraIngreso.setValue(getHoraSistema());
                txtHoraSalida.setValue("");
                txtObservaciones.setValue("");
                btnRegistrar.setDisabled(false);
                //el personal ya existe por tanto guarda el estado en una variable de sesion
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "si");
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existeCliente", "si");
            }
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(TurnosVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void registrar_action() {
        //System.out.println("Registrar Turno");
        if (usuariosLogica.validarSesion()) {
            try {
                Turno nuevoTurno = new Turno();
                Long docPersonal = Long.parseLong(txtIdentificacion.getValue().toString());
                Personal nuevoPersonal = new Personal();
                nuevoPersonal.setDocumento(docPersonal);
                nuevoPersonal.setNombre(txtNombre.getValue().toString().toUpperCase());
                nuevoPersonal.setApellido(txtApellido.getValue().toString().toUpperCase());
                nuevoPersonal.setCorreo(txtCorreo.getValue().toString());
                nuevoPersonal.setTelefono(txtTelefono.getValue().toString());

                ClienteExterno nuevoClienteExterno = new ClienteExterno();
                nuevoClienteExterno.setDocumento(nuevoPersonal);

                String existePersonal = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("existePersonal");
                String existeCliente = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("existeCliente");

                if (existePersonal.equals("no")) {  //personal no existe cliente no existe
                    nuevoPersonal.setClave(String.valueOf(docPersonal));
                    personalLogica.insertar(nuevoPersonal);
                    clienteExternoLogica.registrar(nuevoClienteExterno);
                } else if (existePersonal.equals("si") && existeCliente.equals("no")) { //personal existe cliente no existe
                    personalLogica.modificar(nuevoPersonal);    //por si el usuario cambia algún dato del personal
                    clienteExternoLogica.registrar(nuevoClienteExterno);
                } else //personal existe cliente existe
                {
                    personalLogica.modificar(nuevoPersonal);    //por si el usuario cambia algún dato del personal, si ya es cliente no modifica nada
                }

                Integer area = Integer.parseInt(getCmbArea().getValue().toString());
                Area areaFunc = areaLogica.consultarPorId(area);

                nuevoTurno.setDocumentoCliente(nuevoClienteExterno);
                nuevoTurno.setArea(areaFunc);
                nuevoTurno.setEstado(txtEstado.getValue().toString());

                SimpleDateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd");
                Date fecha = formatoFecha.parse(getFechaSistema());
                nuevoTurno.setFecha(fecha);//            
                nuevoTurno.setHoraIngreso(txtHoraIngreso.getValue().toString());
                nuevoTurno.setHoraSalida(""); //se pone una cadena vacia para evitar el null
                nuevoTurno.setMotivo(txtMotivo.getValue().toString());
                nuevoTurno.setObservaciones(txtObservaciones.getValue().toString());

                int numeroTurno = turnoLogica.insertar(nuevoTurno);
                limpiar_action();

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Turno se Creó con Exito con el Número: " + numeroTurno + " Para el Area: " + areaFunc.getNombre()));

            } catch (NumberFormatException nfe) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error ", "Número de Documento Inválido"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }
            setListaTurnos(null);
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(TurnosVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
